/********************************************************************************
 * Project Name		[JavaSE_Fundamentals]
 * File Name     	[TestBufferedStream.java]
 * Creation Date 	[2015-01-01]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ********************************************************************************/
package io.api;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * java.io.BufferedInputStream测试<br/>
 * java.io.BufferedOutputStream测试<br/>
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 * 
 */
public class TestBufferedStream {

	/**
	 * 使用BufferedInputStream & BufferedOutputStream拷贝文件
	 * 
	 * @param fileSource
	 * @param fileDest
	 */
	public static void copyFileByBufferInputOutputStream(String fileSource, String fileDest) {
		// BufferedStream内部维护了一个8KB的字节数组
		BufferedInputStream in = null;
		BufferedOutputStream out = null;
		// 使用BufferedOutStream写数据时, 它的write方法先把数据写到它内部维护的字节数组中
		// 如果需要把数据真正的写到硬盘上面, 需要调用flush方法或者是close方法, 或者是内部维护的字节数组已经填满数据的时候

		try {
			in = new BufferedInputStream(new FileInputStream(fileSource));
			out = new BufferedOutputStream(new FileOutputStream(fileDest));

			// 如果传入了缓冲数组, 内容是存储到缓冲数组中, 返回值是存储到缓冲数组中的字节个数
			// byte[] buffer = new byte[1024];
			// int length = in.read(buffer);

			// 如果使用read方法没有传入缓冲数组, 那么返回值是读取到的内容
			int content = 0;
			while ((content = in.read()) != -1) {
				out.write(content);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				// 先关闭输出流, 再关闭输入流
				if (out != null) {
					out.close();
				}
				if (in != null) {
					in.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
